/**
  ******************************************************************************
  * @file    main.c
  * @author  MCU Application Team
  * @brief   Main program body
  ******************************************************************************
  * @attention
  *     
  *   全部做好
  ******************************************************************************
  */
  
/* Includes ------------------------------------------------------------------*/

#include "main.h"
#include <stdio.h>
#include <stdlib.h>

#define PROJECT  "batman "          //
#define VERSION = "1.0.0"

  	struct _run_ms
	{
		unsigned long ms;
		unsigned char startFlag;
	};
    struct  _run_ms  runtime; 
/* Private define ------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
extern unsigned char reg_time3 ;
/* Private user code ---------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
static void APP_SystemClockConfig(void);
void sub_self(void);
//static void APP_GpioConfig(void);
static void APP_SystemClockConfig(void);
void Error_Handler(void);
unsigned short int SedDistanceFormSW (void);
unsigned char GetRandomNumber(void);
void confuse(unsigned char random);
unsigned char  mianRun(unsigned int readWord);
  void horse_race_lamp  (unsigned int tim );
  unsigned char high_hand_mianRun   (unsigned int cnt);
 void SG_RangingTest(ND03_Dev_t *pNxDevice); 
/* Private define    ---- ----------------------------------------------------------*/

 #define HL_INPUT 			HAL_GPIO_ReadPin(GPIOF, GPIO_PIN_1)
unsigned char buf[18];
unsigned int speed_time,old_time;
unsigned long stopMode_time;
 UART_HandleTypeDef UartHandle;                 
ADC_HandleTypeDef             AdcHandle;
ADC_ChannelConfTypeDef        sConfig;

static void APP_AdcInit(void);
/**  ----------------------------------------------------------------------------------
  * @brief   应用程序入口函数
  * @retval  int
  */
#define myid    '3'      //----------------id 

// ---设置全局变量   
ND03_Dev_t    g_nd03_device; // = {.i2c_dev_addr = ND03_DEFAULT_SLAVE_ADDR, .SetXShutPinLevelFunc = set_xshut_pin_level};
unsigned char flag ;


int main(void)
{
	
	
	ND03_RangingData_t data,saved_data;
	unsigned char i,count;

	
	WORD_VAL    ii;
		/* 函数指针结构体 */
    ND03_Func_Ptr_t dev_op = {NULL, NULL, NULL, NULL}; 
	   /* 初始化设备变量的IIC地址 */
 	g_nd03_device.i2c_dev_addr = ND03_DEFAULT_SLAVE_ADDR;    /// ND03的设备地址   ==   0X5B        读B7  写B6
    g_nd03_device.SetXShutPinLevelFunc = set_xshut_pin_level;  ///< 如果设置XShut电平函数指针，参数值为0，则输出低电平，否则输出高电平

//	UART_HandleTypeDef UartHandle;  

	
  /* 初始化所有外设，Flash接口，SysTick */
   HAL_Init();
   HAL_Delay(100);
  /* 系统时钟配置 */
  APP_SystemClockConfig(); 
  
  /* 初始化LED */

	__HAL_RCC_GPIOA_CLK_ENABLE();
	__HAL_RCC_GPIOB_CLK_ENABLE();               /* 使能GPIOB时钟 */
	__HAL_RCC_GPIOF_CLK_ENABLE(); 
	  __HAL_RCC_USART1_CLK_ENABLE();
	 __HAL_RCC_USART2_CLK_ENABLE();

	 __HAL_RCC_LSI_ENABLE();

  /* 等待直到LSI READY置位 */
  while (READ_BIT(RCC->CSR, RCC_CSR_LSIRDY) == 0U);	
  HAL_Delay(100);
  HAL_Delay(300);
//---------------------------------------------------

	    BSP_USART_Config() ;
	    init_leds ();
    	init_tim3();
		 MyI2C_Init();
	  
		
/* 初始化函数指针结构体  把自己的程序带入  ，这个API  不涉及底层 */
	dev_op.Delay10usFunc = delay_10us;
	dev_op.Delay1msFunc = delay_1ms;
	dev_op.I2C_ReadNBytesFunc = i2c_read_nbytes;
	dev_op.I2C_WriteNBytesFunc = i2c_write_nbytes;
	
		/* 将host端功能函数注册到SDK中 */
    ND03_RegisteredPlatformApi(dev_op);		
	   MyI2C_Init();
//	  	XSHUT_ND03_L 
		HAL_Delay(300);
//		XSHUT_ND03_H 
    /* 循环等待设备启动, 若模组或者IIC读写函数有问题则会报错 */
	if(ND03_ERROR_NONE != ND03_WaitDeviceBootUp(&g_nd03_device))   //带入一个结构体指针
	{

		while(1)
		{
			Led_on;
//			SDA_HIGH;  	

//			SCL_HIGH;  		 

			HAL_Delay(100);
			Led_off;	
//			SDA_LOW
//			SCL_LOW 
			HAL_Delay(100);
		}
	}
	/* 初始化模组设备 */
	if(ND03_ERROR_NONE != ND03_InitDevice(&g_nd03_device))
	{
	
		while(1)
		{
			Led_on;
			HAL_Delay(50);
			Led_off;	
			HAL_Delay(50);
		}
		
	}	

//-----------------------------------------------------------------init dog
//	   	init_iwdg();
//----------------------------------------------------------------

		count = 0;

	while (1)
	{
		       
		
//				 if (stopMode_time	 > 2)
//				 {
//					 stopMode_time  =0; 
					 SG_RangingTest(&g_nd03_device);	

//					if ( flag == 1)
//					{
//						sub_sos();
//						flag = 0;
//					}					 
//				 }
//				 else
//				 {
//					 SUB_STOPMODE () ;
//				 }
				 
				
		
     }
}


//-------------------------------------------------------------------------
//-------------------------------------------------------------------------
 
/**
 * @brief 单次测量接口
 * 
 * @param pNxDevice 模组设备
 */
void SG_RangingTest(ND03_Dev_t *pNxDevice)
{
    ND03_RangingData_t data;
    /* 请求一次测量 */
    ND03_StartMeasurement(pNxDevice);
    /* 获取测量数据 */
    ND03_GetRangingData(pNxDevice, &data);
	
	
	  //uint16_t depth; ///< 测量距离/mm
    //uint16_t amp;   ///< 测量幅度值，作为信号可信度
	//@brief 获取当前ND03的积分时间  当前积分时间/us       (不知道是什么意思）

    NX_PRINTF("depth:%d mm, amp:%d, exp:%d\r\n", data.depth, data.amp, ND03_GetCurrentExp(pNxDevice));
	
	if (data.amp > 100)
	{
		
//			if (data.depth < 700)       //小于700  一个灯亮  GREEN
//			{			
					Led_on;
				    flag  = 1;
////					buz_on;
////				    HAL_Delay(50);
////					 Led_off;
////				 buz_off;
//			}
//			else
//			{
//				  Led_off;
//				 buz_off;
//				  flag = 0;
//			}
		
	}
	else
	{
		 flag = 0;
		  Led_off;
		buz_off;
	}

	
}


 //-------------------------------------------------------------------------------------

 void   SUB_STOPMODE    (void)
 {
  
//				/* systick中断关闭 */
//				HAL_SuspendTick();  


//				/* 进入STOP模式 */
				//输入 电源调节器模式    ；选择唤醒STOP模式的方式
				// PWR_MAINREGULATOR_ON 主调节器   ;PWR_LOWPOWERREGULATOR_ON 低功率调节器
				//WFI 使用中断唤醒 STOP 模式   ;      WFE 使用事件唤醒 STOP 模式
//				HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);  

				 HAL_PWR_EnterSLEEPMode   ( PWR_STOPENTRY_WFI); 
	 
				/* systick中断开启 */
				HAL_ResumeTick();  

}
 //-----------------------------------------------------------------------------------------



 //-阻塞 等待中断 ,前提是打开定时器------------------------------------------------------------------------
void my_Delay_100ms(unsigned int one_hundred_ms)
{
	ms100 =   one_hundred_ms;
	while(ms100)         //阻塞 等待中断，  需要慎用
	{
		
	}
}

 void horse_race_lamp  (unsigned int tim )
 { 
		 led_HIGH;
		 buz_on;
	     my_Delay_100ms(2);    //		 HAL_Delay(tim);

		 buz_off;
		 led_LOW;
		  my_Delay_100ms(2);  //HAL_Delay(tim);
 }

///**  **************************************************************************************************




/**
  * @brief   系统时钟配置函数
  * @param   无
  * @retval  无
  外部高速时钟 HSE
  外部低速时钟 LSE
  
   内部高速时钟 HSI
   内部低速时钟 LSI   --看门狗
  
  */
static void APP_SystemClockConfig(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
   // 设置振荡源类型
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_HSI \
                                   | RCC_OSCILLATORTYPE_LSI | RCC_OSCILLATORTYPE_LSE;  /* 配置HSE、HSI、LSI、LSE */
  
  // 开启内部高速时钟
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;                                             /* 开启HSI */
  // 内部高速时钟不分频, 分频系数可以设置为 1, 2, 4, 8, 16, 32, 64, 128
  RCC_OscInitStruct.HSIDiv = RCC_HSI_DIV1;                                             /* HSI不分频 */
  // 设置内部高速时钟频率为16MHz
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_16MHz;                    /* HSI校准频率16MHz */
  
  
    // 关闭其它时钟: 外置高速, 内置低速, 外置低速
  RCC_OscInitStruct.HSEState = RCC_HSE_OFF;                                            /* 关闭HSE */
  RCC_OscInitStruct.LSIState = RCC_LSI_OFF;                                            /* 关闭LSI */
  RCC_OscInitStruct.LSEState = RCC_LSE_OFF;                                            /* 关闭LSE */
  
  // 关闭PLL
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;                                         /* 开启PLL */
  
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;                                 /* PLL时钟源HSI */
  /* 配置振荡器 */
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
		
  }
	// 修改时钟后, 重新初始化 AHB,APB 时钟
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1;/* 配置SYSCLK、HCLK、PCLK */
  
   // 设置 SYSCLK 时钟源为内部高速时钟
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;                                     /* 配置系统时钟为PLL */
  
  
  
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;                                            /* AHB时钟不分频 */
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;                                             /* APB时钟不分频 */
  /* 配置时钟源 */
  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
  {
    Error_Handler();

  }
}

/**
  * @brief   错误执行函数
  * @param   无
  * @retval  无
  */
void Error_Handler(void)
{
  /* 无限循环 */
//  while (1)
//  {
//			HAL_GPIO_TogglePin (GPIOB, GPIO_PIN_0);
//  }
}


	/**
 * @brief  ADC配置函数
 * @param  无
 * @retval 无
 */
static void APP_AdcInit(void)
{
  __HAL_RCC_ADC_FORCE_RESET();
  __HAL_RCC_ADC_RELEASE_RESET(); /* 复位ADC */
  __HAL_RCC_ADC_CLK_ENABLE();    /* 使能ADC时钟 */

  AdcHandle.Instance = ADC1;

  /* ADC校准 */
  if (HAL_ADCEx_Calibration_Start(&AdcHandle) != HAL_OK)
  {
    Error_Handler();
  }

  AdcHandle.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV32;           /* 设置ADC时钟 */
  AdcHandle.Init.Resolution = ADC_RESOLUTION_12B;                      /* 转换分辨率12bit */
  AdcHandle.Init.DataAlign = ADC_DATAALIGN_RIGHT;                      /* 数据右对齐 */
  AdcHandle.Init.ScanConvMode = ADC_SCAN_DIRECTION_FORWARD;            /* 扫描序列方向：向上 */
  AdcHandle.Init.EOCSelection = ADC_EOC_SINGLE_CONV;                   /* 单次采样 */
  AdcHandle.Init.LowPowerAutoWait = ENABLE;                            /* 等待转换模式开启 */
  AdcHandle.Init.ContinuousConvMode = DISABLE;                         /* 单次转换模式 */
  AdcHandle.Init.DiscontinuousConvMode = DISABLE;                      /* 不使能非连续模式 */
  AdcHandle.Init.ExternalTrigConv = ADC_SOFTWARE_START;                /* 软件触发 */
  AdcHandle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; /* 触发边沿无 */
  AdcHandle.Init.DMAContinuousRequests = DISABLE;                      /* DMA不使能 */
  AdcHandle.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;                   /* 当过载发生时，覆盖上一个值 */
  AdcHandle.Init.SamplingTimeCommon = ADC_SAMPLETIME_13CYCLES_5;       /* 设置采样周期 */

  if (HAL_ADC_Init(&AdcHandle) != HAL_OK) /* 初始化ADC */
  {
    Error_Handler();
  }

  sConfig.Channel = ADC_CHANNEL_0;        /* ADC通道选择 */
  sConfig.Rank = ADC_RANK_CHANNEL_NUMBER; /* 设置加入规则组通道 */
  /* 配置ADC通道 */
  if (HAL_ADC_ConfigChannel(&AdcHandle, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }

//  sConfig.Channel = ADC_CHANNEL_1;        /* ADC通道选择 */
//  sConfig.Rank = ADC_RANK_CHANNEL_NUMBER; /* 设置加入规则组通道 */
//  /* 配置ADC通道 */
//  if (HAL_ADC_ConfigChannel(&AdcHandle, &sConfig) != HAL_OK)
//  {
//    Error_Handler();
//  }

//  /* ADC 模拟看门狗初始化 */
//  ADCAnalogWDGConfig.WatchdogMode = ADC_ANALOGWATCHDOG_ALL_REG; /* 所有通道*/
//  ADCAnalogWDGConfig.HighThreshold = 0X1FF;                     /* 设置上阈值 */
//  ADCAnalogWDGConfig.LowThreshold = 0;                          /* 设置下阈值 */
//  ADCAnalogWDGConfig.ITMode = ENABLE;                           /* 使能中断 */
//  /* ADC模拟看门狗配置 */
//  if (HAL_ADC_AnalogWDGConfig(&AdcHandle, &ADCAnalogWDGConfig) != HAL_OK)
//  {
//    Error_Handler();
//  }
  HAL_NVIC_SetPriority(ADC_COMP_IRQn, 0, 0); /* 设置ADC中断优先级 */
  HAL_NVIC_EnableIRQ(ADC_COMP_IRQn);         /* 设置ADC内核中断 */
}

// /**   ****************************************************************************************************
//  * @brief      自适应的自检程序
//  * @param   
//  * @retval  无


//  *************************************************************************************************************/


		
#ifdef  USE_FULL_ASSERT
/**
  * @brief  输出产生断言错误的源文件名及行号
  * @param  file：源文件名指针
  * @param  line：发生断言错误的行号
  * @retval 无
  */
void assert_failed(uint8_t *file, uint32_t line)
{
  /* 用户可以根据需要添加自己的打印信息,
     例如: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* 无限循环 */
  while (1)
  {
  }
}
#endif /* USE_FULL_ASSERT */

/************************ (C) COPYRIGHT AirM2M *****END OF FILE******************/
